home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 8 / FM Towns Free Software Collection 8.iso / t_os / bb / src / filesel.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-06-01  |  9.1 KB  |  387 lines

  1. /*
  2.         new file select
  3.                       1993.6.27 v1.0
  4.                       copyright Y.Ouchi
  5. */
  6. #include    <stdio.h>
  7. #include    <string.h>
  8. #include    <stdlib.h>
  9. #include    <sys/extender.h>
  10. #include    "egb.h"
  11. #include    "mos.h"
  12. #include    "bb.h"
  13.  
  14.     /* 関数プロトタイプ宣言 */
  15. extern    char    egbwork[];
  16. extern    char    moswork[];
  17. extern    void    linedsp(int, int, char *);
  18. extern    void    linedspv(int, int, char *, int, unsigned int, unsigned int);
  19. extern    void    linedspvl(int,int,char *,int,int,unsigned int,unsigned int);
  20. extern    void    box(int, int, int, int, int, int);
  21. extern    void    line(int, int, int, int, int);
  22. extern    int        panelread(int, struct panel *, int);
  23. extern    void    panelinit(int, struct panel *, char **, int );
  24. extern    int        crfindb(int, char *, int *, int *);
  25. extern    int        crfindl(int, char *, int *, int *);
  26.         void    init_disp(void);
  27.         int        fileheaddsp(char *);
  28.         void    fileheadclr(void);
  29.  
  30.     char    *drivename[16]={"A","B","D","E","F","G","H","I",
  31.                             "J","K","L","M","N","O","P","Q"};
  32.     char    driveflag[16]={0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
  33.                             0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01};
  34.     struct    panel    n_menu[2];
  35.     char    files[256][15];
  36.     static    int        fdisp;
  37.     static    int        fdispx=0,fdispy=400;
  38.     static    int        px=120,py=50;
  39.  
  40. char * filesel ( void )
  41. {
  42. static    char    filename[128]={"p:/src/readme.doc"};
  43.         char    flag,fflag,subdir;
  44.         int        i,j,disp_start_no;
  45.         int        atrib,res,file_no,menu_res,cdriveno;
  46.         char    *work_char_ad;
  47.         char    motherdir[8]={".."};
  48.         char    wild[8]={"*.*"};
  49.         char    dirchange[]={".. upper dir"};
  50.         char    cdir[128];
  51.         char    cdrive[4]={"X:"};
  52.         char    path[128];
  53.         char    enqfile[128];
  54.         char    workfile[128];
  55.         char    buf[128];
  56. struct    _disk_space    ds;
  57.  
  58.                     /* initial display */
  59.     init_disp( );
  60.     fileheadclr();
  61.  
  62.     EGB_writePage(egbwork,0);
  63.     EGB_color(egbwork, 0, TEXT_COL);
  64.  
  65.                     /* current drive & current path get */
  66.     cdriveno=_dos_get_default_disk_number();
  67.     cdrive[0]=0x41+cdriveno;
  68.     getcwd(cdir,128);
  69.     flag=1;
  70.     do{
  71.         box(px+16,py+16,px+53,py+53,BOTAN_COL,1);
  72.         box(px+66,py+36,px+173,py+53,BOTAN_COL,1);
  73.         EGB_color(egbwork, 0, NAME_COL);
  74.         EGB_fontStyle(egbwork, 1);
  75.         if (cdriveno>1) linedsp(px+28,py+42,drivename[cdriveno-1]);
  76.         else linedsp(px+28,py+42,drivename[cdriveno]);
  77.         EGB_fontStyle(egbwork, 0);
  78.         if (strlen(cdir)>1){
  79.             for(i=strlen(cdir)-1;i>=0;i--) if(cdir[i]==0x2f) break;
  80.             linedsp(px+67,py+52,&cdir[i+1]);
  81.             subdir=1;
  82.             files[0][0]=0x00;
  83.             strcpy(files[0],dirchange);
  84.         }
  85.         else{
  86.             linedsp(px+67,py+52,cdir);
  87.             subdir=0;
  88.         }
  89.         EGB_color(egbwork, 0, TEXT_COL);
  90.  
  91.         path[0]=0x00;
  92.         strcat(path,cdrive);
  93.         strcat(path,cdir);
  94.         i=strlen(path);
  95.         if (path[i-1]!=0x2f){
  96.             path[i]=0x2f;
  97.             path[i+1]=0x00;
  98.         }
  99.         for ( i=0;i<strlen(path);i++) if (path[i]==0x2f) path[i]=0x5c;
  100.         enqfile[0]=0x00;
  101.         strcpy(enqfile,path);
  102.         strcat(enqfile,wild);
  103.  
  104.                     /* file names get */
  105.         _dos_set_disk_transfer_area_address(buf);
  106.         if (subdir==0) file_no=0;
  107.         else file_no=1;
  108.         atrib=22;
  109.         res=_dos_find_first(enqfile,atrib);
  110.         while (res==0){
  111.             work_char_ad=buf+30;
  112.             if (work_char_ad[0]!=0x2e){
  113.                 workfile[0]=0x00;
  114.                 strcat(workfile,path);
  115.                 strcat(workfile,work_char_ad);
  116.                 if ((_get_file_mode(workfile) & 0x4000)==0x4000){
  117.                     files[file_no][0]=0x20;
  118.                     files[file_no][1]=0x00;
  119.                     strcat(files[file_no],work_char_ad);
  120.                     i=strlen(files[file_no]);
  121.                     files[file_no][i]=0x3e;
  122.                     files[file_no][i+1]=0x00;
  123.                 }
  124.                 else{
  125.                     files[file_no][0]=0x00;
  126.                     strcat(files[file_no],work_char_ad);
  127.                 }
  128.                 file_no++;
  129.             }
  130.             res=_dos_find_next( )  ;
  131.         }
  132.  
  133.         if (subdir==0){
  134.             work_char_ad=files[0];
  135.             i=file_no;
  136.         }
  137.         else{
  138.             work_char_ad=files[1];
  139.             i=file_no-1;
  140.         }
  141.         qsort(work_char_ad,i,15,(int *)strcmp);
  142.  
  143.         for (i=0;i<file_no;i++) if (files[i][0]==0x20) files[i][0]=0x3c;
  144.  
  145.         disp_start_no=0;
  146.         fflag=1;
  147.         while ( fflag ){
  148.             box(px+15,py+125,px+174,py+324,BACK_COL,1);
  149.             EGB_color(egbwork, 0, TEXT_COL);
  150.             for ( j=0;j<10;j++ ){
  151.                 if (disp_start_no+j>=file_no) break;
  152.                 linedspv(px+47,py+142+j*20,files[disp_start_no+j],
  153.                                             0,TEXT_COL,BACK_COL);
  154.             }
  155.             while ( (menu_res = panelread (2, n_menu, 1)) >= 2000 );
  156.             if ( menu_res<100 ){
  157.                 if (menu_res==0 || menu_res==1){
  158.                     cdriveno=menu_res;
  159.                     cdrive[0]=0x41+menu_res;
  160.                     _dos_select_disk(menu_res);
  161.                     getcwd(cdir,128);
  162.                     fflag=0;
  163.                 }
  164.                 else{
  165.  
  166.  
  167.                     ds=_dos_get_disk_space(menu_res+2);
  168.                     if (ds.nsectors!=0xffff){
  169.                         cdriveno=menu_res+1;
  170.                         cdrive[0]=0x42+menu_res;
  171.                         _dos_select_disk(menu_res+1);
  172.                         getcwd(cdir,128);
  173.                         fflag=0;
  174.                     }
  175. /*****************************************************
  176.                     if (driveflag[menu_res]==0x01){
  177.                         cdriveno=menu_res+1;
  178.                         cdrive[0]=0x42+menu_res;
  179.                         _dos_select_disk(menu_res+1);
  180.                         getcwd(cdir,128);
  181.                         fflag=0;
  182.                     }
  183. *****************************************************/
  184.  
  185.  
  186.                 }
  187.                 fileheadclr();
  188.             }
  189.             else{
  190.                 if (menu_res==100){
  191.                     if (disp_start_no+10<file_no){
  192.                         disp_start_no=disp_start_no+10;
  193.                     }
  194.                 }
  195.                 else{
  196.                     if ( menu_res==1100 ){
  197.                         if (disp_start_no-10>=0){
  198.                             disp_start_no=disp_start_no-10;
  199.                         }
  200.                     }
  201.                     else{
  202.                         if ( menu_res<1000 ){
  203.                             j=disp_start_no+menu_res-101;
  204.                             if(j==0 && subdir==1){
  205.                                 enqfile[0]=0x00;
  206.                                 strcpy(enqfile,path);
  207.                                 strcat(enqfile,motherdir);
  208.                                 chdir(enqfile);
  209.                                 getcwd(cdir,128);
  210.                                 fflag=0;
  211.                                 fileheadclr();
  212.                             }
  213.                             else{
  214.                                 if (j<file_no){
  215.                                     if (files[j][0]==0x3c 
  216.                                             && files[j][strlen(files[j])-1]
  217.                                             ==0x3e){
  218.                                         enqfile[0]=0x00;
  219.                                         strcpy(enqfile,path);
  220.                                         strcat(enqfile,&files[j][1]);
  221.                                         enqfile[strlen(enqfile)-1]=0x00;
  222.                                         chdir(enqfile);
  223.                                         getcwd(cdir,128);
  224.                                         fflag=0;
  225.                                         fileheadclr();
  226.                                     }
  227.                                     else{
  228.                                         if(j==fdisp){
  229.                                             filename[0]=0x00;
  230.                                             strcat(filename,path);
  231.                                             strcat(filename,files[j]);
  232.                                             fflag=0;
  233.                                             flag=0;
  234.                                         }
  235.                                         else{
  236.                                             if(fileheaddsp(files[j])!=0)
  237.                                                                     fdisp=j;
  238.                                         }
  239.                                     }
  240.                                 }
  241.                             }
  242.                         }
  243.                         else{
  244.                             filename[0]=0x00;
  245.                             fflag=0;
  246.                             flag=0;
  247.                         }
  248.                     }
  249.                 }
  250.             }
  251.         }
  252.     }while ( flag );
  253.  
  254.     MOS_disp( 0 );
  255.     MOS_horizon( 0,639 );
  256.     MOS_vertical( 0,479 );
  257.     EGB_clearScreen(egbwork);
  258.     EGB_color(egbwork, 0, TEXT_COL);
  259.     EGB_color(egbwork, 1, BACK_COL);
  260.  
  261.     return(filename);
  262.  
  263. }
  264.  
  265. /*
  266.         initial panel display
  267. */
  268.  
  269. void    init_disp( )
  270. {
  271.     char    pagechar[21]={"▲ page up/down ▼"};
  272.     int        i;
  273.     struct    _disk_space    ds;
  274.  
  275.     EGB_writePage(egbwork,0);
  276.     box(px,py,px+189,py+339,FILES_BACK_COL,1);
  277.  
  278.     box(px+15,py+15,px+54,py+54,BOTAN_COL,1);
  279.     box(px+65,py+35,px+174,py+54,BOTAN_COL,1);
  280.     line(px+15,py+15,px+54,py+15,SHADOW);
  281.     line(px+15,py+15,px+15,py+54,SHADOW);
  282.     line(px+15,py+54,px+54,py+54,HILIGHT);
  283.     line(px+54,py+15,px+54,py+54,HILIGHT);
  284.  
  285.     line(px+65,py+35,px+174,py+35,SHADOW);
  286.     line(px+65,py+35,px+65,py+54,SHADOW);
  287.     line(px+65,py+54,px+174,py+54,HILIGHT);
  288.     line(px+174,py+35,px+174,py+54,HILIGHT);
  289.  
  290.     box(px+15,py+105,px+174,py+124,BOTAN_COL,1);
  291.     box(px+15,py+125,px+174,py+274,BACK_COL,1);
  292.  
  293.     EGB_color(egbwork, 0, TEXT_COL);
  294.     linedsp(px+23,py+122,pagechar);
  295.  
  296. /******************************** test
  297.     for (i=4;i<17;i++){
  298.         ds=_dos_get_disk_space(i);
  299.         if (ds.nclusters>=0xffff){
  300.             drivename[i-2][0]=0x81;
  301.             drivename[i-2][1]=0x7c;
  302.             driveflag[i-2]=0x00;
  303.         }
  304.         else{
  305.             driveflag[i-2]=0x01;
  306.         }
  307.     }
  308. ********************************/
  309.  
  310.     n_menu[0].xpos=px+15;
  311.     n_menu[0].ypos=py+65;
  312.     n_menu[0].xsize=160;
  313.     n_menu[0].ysize=40;
  314.     n_menu[0].xbtnsize=20;
  315.     n_menu[0].ybtnsize=20;
  316.     n_menu[0].ful=1;
  317.     n_menu[0].disp=1;
  318.     n_menu[0].ini_digit=0;
  319.  
  320.     panelinit(1,n_menu,drivename,1);
  321.  
  322.     n_menu[1].xpos=px+15;
  323.     n_menu[1].ypos=py+105;
  324.     n_menu[1].xsize=160;
  325.     n_menu[1].ysize=220;
  326.     n_menu[1].xbtnsize=160;
  327.     n_menu[1].ybtnsize=20;
  328.     n_menu[1].ful=0;
  329.     n_menu[1].disp=1;
  330.     n_menu[1].ini_digit=100;
  331.  
  332.     MOS_horizon( px+15,px+174 );
  333.     MOS_vertical( py+65,py+324 );
  334.     MOS_setpos( px+50, py+135 );
  335.     MOS_disp( 1 );
  336. }
  337.  
  338. /*
  339.         file head display
  340. */
  341.  
  342. int        fileheaddsp(char *fn)
  343. {
  344.     int        filesize;
  345.     int        lineleng,nextp1,nextp2,nextp3;
  346.     FILE    *inFp;
  347.     char    txt[250];
  348.  
  349.     inFp=fopen(fn,"rb");
  350.     if(inFp==NULL) return(0);
  351.     filesize=fread(txt,1,240,inFp);
  352.     fclose(inFp);
  353.     if (filesize<=0) return(0);
  354.  
  355.     EGB_writePage(egbwork,0);
  356.     box(fdispx,fdispy,fdispx+639,fdispy+51,BOTAN_COL,1);
  357.     crfindl(filesize,txt,&lineleng,&nextp1);
  358.     linedspvl(fdispx,fdispy+16,txt,lineleng,0,TEXT_COL,BOTAN_COL);
  359.     if(nextp1>0){
  360.         crfindl(filesize-lineleng,&txt[nextp1],&lineleng,&nextp2);
  361.         linedspvl(fdispx,fdispy+33,&txt[nextp1],lineleng,
  362.                                                 0,TEXT_COL,BOTAN_COL);
  363.         if(nextp2>0){
  364.             crfindl(filesize-lineleng,&txt[nextp1+nextp2],&lineleng,&nextp3);
  365.             linedspvl(fdispx,fdispy+50,&txt[nextp1+nextp2],lineleng,
  366.                                                     0,TEXT_COL,BOTAN_COL);
  367.         }
  368.         EGB_color(egbwork, 0, TEXT_COL);
  369.         return(1);
  370.     }
  371.     else{
  372.         EGB_color(egbwork, 0, TEXT_COL);
  373.         return(0);
  374.     }
  375. }
  376.  
  377. /*
  378.         file head display clear
  379. */
  380.  
  381. void    fileheadclr( )
  382. {
  383.     fdisp=-1;
  384.     box(fdispx,fdispy,fdispx+639,fdispy+51,BACK_COL,1);
  385. }
  386.  
  387.